Computer graphics display systems are commonly used for displaying graphical representations of objects on a two-dimensional video display screen. Current computer graphics display systems provide highly detailed representations and are used in a variety of applications. A computer graphics display system generally comprises a central processing unit (CPU), system memory, a graphics system and a graphics display screen. More specifically, conventional computer graphics systems commonly include a display device having a two-dimensional (2D) array of light emitting areas. The light emitting areas are usually referred to as “pixels,” which is an abbreviation for picture elements. Such a graphics system typically employs hardware, software, or both to generate a 2D array of values that determine the colors or shades of grey that are to be emitted from the corresponding pixels of the display.
Computer graphics systems are commonly employed for the display of three-dimensional (3D) objects. Typically, such a system generates what appears to be a 3D object on a 2D display by generating 2D views of the 3D object that is modeled in the computer memory. The 2D view of a 3D object which is generated at a particular time usually depends at least on a spatial relationship between the 3D object and a viewer of the 3D object at the particular time. This spatial relationship may be referred to as the view or eye point direction. For example, a car is a 3D object having a front and a back. However, whether one can see the taillights will depend on the position from which one is viewing the car. A view direction that is directly in front of the car will not show the taillights (but may instead show the headlights), while a view direction that is directly behind the car will show the taillights.
The process by which a computer graphics system generates the values for a 2D view of a 3D object is commonly referred to as image rendering or scan conversion. In typical computer graphics display systems, an object to be presented on the display screen is broken down into graphics primitives. Primitives are basic components of a graphics display and may include points, lines, vectors and polygons (e.g., triangles and quadrilaterals). Typically, a hardware/software scheme is implemented to render, or draw, the graphics primitives that represent a view of one or more objects being represented on the display screen.
Generally, the primitives of the three-dimensional object to be rendered are generated in terms of primitive data by software being executed by the host CPU. For example, when the primitive is a triangle, the software being executed by the host computer defines the primitive in terms of the X, Y and Z coordinates of its vertices, the normals of the vertices, Nx, Ny and Nz, and the red, green, blue and alpha (R, G, B and α) color values of each vertex. Alpha is a transparency value. Additional primitive data may be used in specific applications. Rendering hardware interpolates all of this data to compute the display screen pixels that represent each primitive, and the R, G, B and a values for each pixel.
Thus, conventional graphics systems usually render a 3D object by subdividing the 3D object into a set of polygons and rendering each of the polygons individually. The values for a polygon that are rendered for a particular view direction usually depend on the surface features of the polygon and the effects of the lighting on the polygon. The surface features often include details such as surface colors and surface structures. The effects of lighting usually depend on a spatial relationship between the polygon and one or more light sources. This spatial relationship may be referred to as the light source direction. For example, if there is only one light source, the side of the object closest to the light source will be illuminated while the side of the object furthest from the light source might be in shadow.
Typically, the evaluation of the effects of lighting on an individual pixel in a polygon for a particular view direction involves a number of 3D vector calculations. One of ordinary skill in the art will recognize that the standard Blinn/Phong lighting equation is commonly used in computer graphics for performing lighting calculations for graphical images. Lighting calculations based on the Blinn/Phong equation generally includes floating-point, square-root and divide operations when used with normalized vectors. Such calculations are usually time consuming and expensive whether performed in hardware or software.
One conventional method for reducing such computational overhead is to evaluate the effects of lighting at just a few areas of a polygon, such as the vertices, and then to interpolate the results across the entire polygon. Examples include methods which are commonly referred to as flat shading and Gouraud shading. Such methods usually reduce the number of calculations that are performed during scan conversion and thereby increase rendering speed. Unfortunately, such methods also usually fail to render shading features that are smaller than the areas of individual polygons. If the polygons are relatively large, the view will be noticeably distorted.
One conventional method for rendering features that are smaller than the area of a polygon is to employ what is referred to as a texture map. In general, a texture refers to a graphics data structure which models the surface appearance of an object. A texture may represent the visual experience of many materials and substances (e.g., terrain, plants, minerals, fur, and skin). Textures may be created digitally by sampling a physical surface utilizing photographic techniques. Alternatively, textures may be created manually utilizing a suitable graphics design application. Texture mapping involves mapping the surface appearance to a graphical surface modeled by a 3D structure. A typical texture map is a table that contains a pattern of color values for a particular surface feature. For example, a wood grain surface feature may be rendered using the surface and a texture map that holds a color pattern for wood grain.
Texture mapping may be utilized for any number of applications. For example, texture mapping may be utilized by an architectural software application to generate a realistic depiction of a building based upon blueprint designs. For instance, a stucco texture may be wrapped onto a building frame by the architectural software application. Texture mapping may be additionally used to create special effects for movies, video game animation, website wallpapers, and/or the like. Texture mapping is desirable for these applications because it facilitates the representation of an object with an appreciable amount of realism and detail. Moreover, texture mapping may impart 3D qualities to the computer generated image.
Texture mapping algorithms involve wrapping a texture over the surface of a model. Specifically, a 3D model or data structure of an object is created. For example, FIG. 1A depicts exemplary object 101 in R3 (i.e., 3D real space). The surface of object 101 may be represented as a set of polygons (typically triangles) in 3D space. The polygons are represented by their various vertexes. The vertexes are defined by coordinates in R3. For example, vertex 102 is defined by (X1, Y1, Z1) and vertex 103 is defined by (X2, Y2, Z2).
As described above, most computer displays are only capable of displaying a 2D view of such 3D object 101. Accordingly, a mapping function is utilized to map the coordinates in R3 to coordinates in R2 (i.e., 2D real space). Typically, the mapping occurs by defining a view angle. FIG. 1B depicts such a mapping from object 101 to object 104. Vertex 102 is mapped to vertex 105 where vertex 105 is defined by two coordinates (X3, Y3). Likewise, vertex 103 is mapped to vertex 106 where vertex 106 is defined by two coordinates (X4, Y4). The mapping function allows the data to be represented in a form that may be displayed by a computer display.
Concurrently with the mapping, a texture is applied within the confines of the polygons of object 104 to provide a realistic appearance. For example, texture 201 of FIG. 2 may be applied to the polygons of object 104 to create a stone-like appearance. Texture 201 is typically implemented as a matrix of red-green-blue (RGB) values. The RGB values are mapped utilizing a suitable mapping function to the interior of the polygons of object 104. The final graphical image appears to have texture 201 “wrapped” around object 104.
However, this approach is limited as the final graphical image, to an extent, appears flat. Specifically, the graphical image does not appreciably vary in response to a change in illumination direction. Since it does not appreciably change under these conditions, localized shading or occlusions are not evident. Moreover, interreflections due to surface irregularities are not perceived.
Bump mapping is one texture mapping technique that addresses these limitations. Bump mapping involves creating a bump map of displacement values. The displacement values are utilized to perturb the surface normal vector. The perturbed surface normal vector is utilized to render shading in accordance with the Blinn/Phong lighting equation.
As is well known in the art, texture mapping techniques generally utilize a coordinate system for mapping a texture onto a 3D graphical object. For instance, in rendering a texture represented as polygons (e.g., triangles), a texture mapping technique may use a 3D coordinate system formed by the surface normal vector, tangent vector, and binormal vector for each vertex. Further, as is well known in the art, texture coordinate gradient vectors are commonly computed for orienting the texture within the coordinate system of the texture mapping technique. Thus, in rendering the texture, a texture mapping technique, such as a bump mapping technique, may compute texture coordinate gradient vectors for each polygon (e.g., triangle) that forms the texture being rendered in order to properly orient the texture within the texture mapping's coordinate system. It should be appreciated that the 3D object onto which the texture is being mapped may comprise many polygons. Because the texture coordinate gradient vectors are computed for each of the polygons, much computation may be associated with the computation of such coordinate gradient vectors. Therefore, it is desirable to provide a method for efficiently computing coordinate gradient vectors in order to optimize the efficiency of the rendering process.